//
//  XYStatusesModel.swift
//  01-新浪微博
//
//  Created by 陈许亚 on 16/3/11.
//  Copyright © 2016年 cxy. All rights reserved.
//

import UIKit
import AFNetworking

class XYStatusesModel: NSObject {
    //微博创建时间
    var created_at :String?
    //微博ID
    //微博id  Int 和 OC 中的 NSInteger 是一样的  在OC中 需要使用 long long
    //NSInteger 在32机型上 默认的整形数据的长度 是32位的
    // 在64机型上 默认的整形数据的长度 是64位的
    var id :Int64 = 0
    //微博正文
    var text :String?
    //微博来源
//"<a href=\"http://app.weibo.com/t/feed/1sxHP2\" rel=\"nofollow\">专业版微博</a>"
    var source :String?{
        didSet{
            //定义标记字符串
           let start = "\">"
           let end = "</"
            //获取标记字符串对应的range,在根据前一个标记字符的range的最后一个字符的位置，到第二个标记字符的的range的第一个字符的位置，截取字符串
            if let s = source {
                if let startRange = s.rangeOfString(start),endRange = s.rangeOfString(end) {
//                    print("------")
//                    print(startRange,endRange)
                    //截取字符串
                    sourceText = s.substringWithRange(startRange.endIndex..<endRange.startIndex)
//                    print(startRange.endIndex)
//                    print(endRange.startIndex)
//                    print(sourceText)
//                    print("------")
                    
                }
            }
        }
    }

    var sourceText: String?
    //用户
    var user : XYUserModel?
    
    var pic_urls: [[String: String]]? {
        didSet {
            //给imageURLs赋值
            guard let urls = pic_urls else {
                //如果pic_urls为空，就不给imageURLs赋值
                return
            }
            //因为imageURLs是可选项，默认值是nil，添加元素添加不进去，所以要进行实例化
            imageURLs = [NSURL]()
            //遍历数组
            for item in urls {
                 let urlString = item["thumbnail_pic"]
                guard let url = urlString else {
                    return
                }
                let imageURL = NSURL(string: url)
                imageURLs?.append(imageURL!)
            }
        }
    }
    //视图层需要用什么样的数据，模型层就应该处理好什么样的数据，供外界直接使用
    var imageURLs: [NSURL]?
    //KVC
    init(dict :[String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    override func setValue(value: AnyObject?, forKey key: String) {
        //对user进行特殊出来
        
        if key == "user" {
            guard let dict = value as? [String: AnyObject] else {
                return
            }
            //将字典转模型
            user = XYUserModel(dict: dict)
            return
            
        }
        super.setValue(value, forKey: key)
    }
    //MARK:重写描述方法
    override var description: String {
        let keys = ["created_at","id","text","source"]
        let dict = self.dictionaryWithValuesForKeys(keys)
        return dict.description
    }
    
    
}

extension XYStatusesModel {
    //加载用户信息
    //参数是一个闭包：无返回值，参数是数组的闭包
    class func loadUserData(finished: (array: [XYStatusesModel]?) -> ()){
        
        //获取token ，如果等号后方有值的话，直接赋值给token，执行}之后的代码块，如果=nil,执行else后的代码块
        guard  let token = XYUserAccount.sharedAccount.access_token else {
            print("用户未登录/登录过期")
            return
        }
        
        let url = "https://api.weibo.com/2/statuses/home_timeline.json"
        let parameters = ["access_token": token]
        let AFN = AFHTTPSessionManager()
        AFN.GET(url, parameters: parameters, success: { (_, result) -> Void in
            // print(result)
            //将result转化为字典类型
            guard let dict = result as? [String: AnyObject] else {
                finished(array: nil)
                return
            }
            //通过userDataDict["statuses"]得到staArr是AnyObject类型，要将其转化为数组类型，又因为数组里面都是字典，所以要用[]包一下[[String : AnyObject]],字典类型的数组
            
            guard let array = dict["statuses"] as? [[String : AnyObject]] else {
                finished(array: nil)
                print("数据结构类型错误")
                return
            }
            //创建一个可变数组
            var arrM = [XYStatusesModel]()
            //遍历数组
            for item in array {
                //字典转模型 ,其实就是用的模型的构造方法
                let s = XYStatusesModel(dict: item)
                //此时打印s打印出来的是地址，所以要从写model的discription方法
//                print(s)
                //将模型添加到数组
                arrM.append(s)
                
            }
            //刷新数据，在模型当中不能提供刷新数据，应该要提供闭包来作为参数来传递数据，在控制器中进行刷新
            finished(array: arrM)
            
            }) { (_, error) -> Void in
                finished(array: nil)
                print(error)
                
        }
        
    }
}
